package com.dingding.nettyserver.core.session;

import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import com.dingding.nettyserver.common.trasferrule.response.Response;
import com.google.protobuf.MessageLite;

/**
 * @Description 会话管理者
 * @author fengshuonan
 * @date 2016年11月18日 下午9:59:06
 */
public class SessionManager {

	/**
	 * 在线的所有会话
	 */
	private static final ConcurrentHashMap<String, Session> onlineSessions = new ConcurrentHashMap<>();

	/**
	 * @Description 把某一个会话加入到集合中
	 * @param userId 用户id
	 * @param session 会话对象
	 * @author fengshuonan
	 */
	public static boolean putSession(String userId, Session session) {
		if (!onlineSessions.containsKey(userId)) {
			boolean success = onlineSessions.putIfAbsent(userId, session) == null ? true : false;
			return success;
		}
		return false;
	}

	/**
	 * @Description 移除某个会话对象
	 * @param userId 用户id
	 * @author fengshuonan
	 */
	public static Session removeSession(String userId) {
		return onlineSessions.remove(userId);
	}

	/**
	 * @Description 发送消息[protoBuf协议]
	 * @param userId 用户id
	 * @param bizType 业务类型
	 * @param module 模块号
	 * @param cmd 命令号
	 * @param message 消息(protoco协议的实例对象)
	 * @author fengshuonan
	 */
	public static <T extends MessageLite> void sendMessage(String userId, byte bizType, short module, short cmd,
			T message) {
		Session session = onlineSessions.get(userId);
		if (session != null && session.isConnected()) {
			Response response = new Response(bizType, module, cmd, message.toByteArray());
			session.write(response);
		}
	}

	/**
	 * @Description 判断某个用户是否在线
	 * @param userId 用户id
	 * @author fengshuonan
	 */
	public static boolean isOnlineUser(String userId) {
		return onlineSessions.containsKey(userId);
	}

	/**
	 * @Description 获取所有在线用户
	 * @author fengshuonan
	 */
	public static Set<String> getOnlineUsers() {
		return Collections.unmodifiableSet(onlineSessions.keySet());
	}
}
